/*
 * 描述： <描述>
 * 修改人： rain
 * 修改时间： 2016年5月21日
 * 项目： rainhy-core
 */
package com.rainhy.core.support.bean;

import java.util.HashMap;
import java.util.Map;

import com.rainhy.core.exception.RainhyException;
import com.rainhy.core.util.RainhyUtils;

/**
 * 返回数据
 * 
 * @author rain
 * @version [版本号, 2016年5月21日]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public class ReturnData<T> {
    /** 是否成功 */
    private boolean success = true;
    
    /** 返回的信息 */
    private String message;
    
    /** 返回数据 */
    private T returnData;
    
    /** 其它返回值 */
    private Map<String, Object> params = new HashMap<String, Object>();
    
    /**
     * 
     * 构建一个默认成功的调用返回
     * 
     * @version [版本号, 2015年12月16日]
     * @see [相关类/方法]
     * @since [产品/模块版本]
     * @author rain
     */
    public ReturnData() {
        this.success = true;
    }
    
    /**
     * 
     * 构建一个"success",消息为 message 的调用返回
     * 
     * @param success 是否调用成功
     * @param message 调用返回信息
     * @param objects 调用返回信息参数
     * 
     * @version [版本号, 2015年12月16日]
     * @see [相关类/方法]
     * @since [产品/模块版本]
     * @author rain
     */
    public ReturnData(boolean success, String message, Object... objects) {
        this.success = success;
        this.message = RainhyUtils.toString(message, objects);
    }
    
    /**
     * 
     * 构建一个返回 T 的调用返回
     * 
     * @param success 是否调用成功
     * @param returnData 调用返回数据
     * 
     * @version [版本号, 2016年5月21日]
     * @see [相关类/方法]
     * @since [产品/模块版本]
     * @author rain
     */
    public ReturnData(boolean success, T returnData) {
        this.success = success;
        this.returnData = returnData;
    }
    
    /**
     * 
     * 构建一个"success",消息为 message 的调用返回
     * 
     * @param success 是否调用成功
     * @param returnData 调用返回数据
     * @param message 调用返回信息
     * @param objects 调用返回信息参数
     * 
     * @version [版本号, 2015年12月16日]
     * @see [相关类/方法]
     * @since [产品/模块版本]
     * @author rain
     */
    public ReturnData(boolean success, T returnData, String message, Object... objects) {
        this.success = success;
        this.returnData = returnData;
        this.message = RainhyUtils.toString(message, objects);
    }
    
    /**
     * 
     * 构建一个异常的调用返回
     * 
     * @param ex 异常
     * 
     * @version [版本号, 2016年1月26日]
     * @see [相关类/方法]
     * @since [产品/模块版本]
     * @author rain
     */
    public ReturnData(Exception ex) {
        this.success = false;
        if (ex instanceof RainhyException) {
            this.message = ((RainhyException) ex).getErrorMessage();
        } else {
            this.message = ex.getMessage();
        }
    }
    
    /**
     * 
     * 构建一个默认成功的,消息为 message 的调用返回
     * 
     * @param message 调用返回信息
     * @param objects 调用返回信息参数
     * 
     * @version [版本号, 2016年5月21日]
     * @see [相关类/方法]
     * @since [产品/模块版本]
     * @author rain
     */
    public ReturnData(String message, Object... objects) {
        this.success = true;
        this.message = RainhyUtils.toString(message, objects);
    }
    
    /**
     * 
     * 构建一个默认成功的返回 T 的调用返回
     * 
     * @param returnData 调用返回数据
     * 
     * @version [版本号, 2016年5月21日]
     * @see [相关类/方法]
     * @since [产品/模块版本]
     * @author rain
     */
    public ReturnData(T returnData) {
        this.success = true;
        this.returnData = returnData;
    }
    
    /** 返回的信息 */
    public String getMessage() {
        return message;
    }
    
    /** 其它返回值 */
    public Map<String, Object> getParams() {
        return params;
    }
    
    /** 返回数据 */
    public T getReturnData() {
        return returnData;
    }
    
    /** 调用是否成功 */
    public boolean isSuccess() {
        return success;
    }
    
    /** 返回的信息 */
    public void putParam(String key, Object value) {
        this.params.put(key, value);
    }
    
    /** 返回的信息 */
    public void setMessage(String message) {
        this.message = message;
    }
    
    /** 其它返回值 */
    public void setParams(Map<String, Object> params) {
        this.params = params;
    }
    
    /** 返回数据 */
    public void setReturnData(T returnData) {
        this.returnData = returnData;
    }
    
    /** 调用是否成功 */
    public void setSuccess(boolean success) {
        this.success = success;
    }
}
